home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games Extra 1996 September / Amiga Games Extra CD-ROM 9-1996.iso / userbox / publicdomain / date2day / d2d.asm < prev    next >
Assembly Source File  |  1996-01-04  |  8KB  |  667 lines

  1.  
  2.     incdir    Includes:
  3.     include    libraries/dosextens.i
  4.     include    offsets/dos_lib.i
  5.     include    offsets/exec_lib.i
  6.  
  7. TRUE        equ    1
  8. FALSE        equ    0
  9.  
  10. DATE_MAX    equ    10
  11. YEAR_MAX    equ    2899
  12. MONTH_MAX    equ    12
  13. DAY31_MAX    equ    31
  14. DAY30_MAX    equ    30
  15. DAY28_MAX    equ    28
  16. DAY29_MAX    equ    29
  17. M31_MAX        equ    7
  18. WEEK_MAX    equ    7
  19.  
  20. YEAR_1582    equ    1582
  21. MONTH_1582    equ    10
  22. DAY_1582    equ    15
  23.  
  24. FEBRUARY    equ    2
  25. FEB_MASK    equ    $00000003
  26.  
  27. STO        equ    100
  28.  
  29.     section    Date2Day,code
  30.  
  31. Begin:
  32.     bra    Start
  33.  
  34. VerStr:
  35.     dc.b    "$VER: Date2Day v1.0 (11.13) 05.07.96",0
  36.  
  37. Author:
  38.     dc.b    '© 1996 Tadek Knapik. Public Domain.',0,0
  39.  
  40. Start:
  41.     move.l    a0,a5
  42.     move.l    a0,Date
  43.     move.l    $4,_SysBase
  44.  
  45.     move.l    _SysBase,a6
  46.     sub.l    a1,a1
  47.     jsr    _LVOFindTask(a6)
  48.     move.l    d0,a0
  49.     tst.l    pr_CLI(a0)
  50.     bne    CLIStuff
  51.     lea    pr_MsgPort(a0),a0
  52.     move.l    a0,a2
  53.     jsr    _LVOWaitPort(a6)
  54.     move.l    a2,a0
  55.     jsr    _LVOGetMsg(a6)
  56.     move.l    d0,a1
  57.     jsr    _LVOForbid(a6)
  58.     jsr    _LVOReplyMsg(a6)
  59.     move.l    #10,d0
  60.     rts
  61.  
  62. CLIStuff:
  63.     move.l    _SysBase,a6
  64.     bsr    OpenDOS
  65.     beq    NoDOS
  66.  
  67.     move.l    _DOSBase,a6
  68.     jsr    _LVOOutput(a6)
  69.     move.l    d0,Output
  70.     beq    NoArgs
  71.  
  72.     cmpi.b    #10,(a5)
  73.     beq    Info
  74.  
  75.     move.l    Date,a1
  76.     bsr    CountString
  77.     cmpi.l    #DATE_MAX,d0
  78.     bgt    BadArgs
  79.  
  80.     move.l    a1,a0
  81.     bsr    ParseDate
  82.     beq    BadArgs
  83.  
  84.     bsr    ParseTheDate
  85.     beq    BadArgs
  86.  
  87.     cmpi.l    #WEEK_MAX,d0
  88.     bgt    BadArgs
  89.  
  90.     moveq    #0,d3
  91.     mulu    #4,d0
  92.  
  93.     lea    DayNames,a0
  94.     move.l    (a0,d0.l),a0
  95.     move.b    (a0)+,d3
  96.     move.l    a0,d2
  97.     move.l    Output,d1
  98.     move.l    _DOSBase,a6
  99.     jsr    _LVOWrite(a6)
  100.  
  101. Koniec:
  102.     bsr    CloseDOS
  103.     moveq    #0,d0
  104.     rts
  105.  
  106. BadArgs:
  107.     bsr    ShowBadArgs
  108. NoArgs:
  109.     bsr    CloseDOS
  110. NoDOS:
  111.     moveq    #10,d0
  112.     rts
  113.  
  114. ShowBadArgs:
  115.     move.l    _DOSBase,a6
  116.     lea    BadArgsTxt,a0
  117.     moveq    #0,d3
  118.     move.b    (a0)+,d3
  119.     move.l    a0,d2
  120.     move.l    Output,d1
  121.     jsr    _LVOWrite(a6)
  122.     rts
  123.  
  124. Info:
  125.     move.l    _DOSBase,a6
  126.     lea    InfoTxt,a0
  127.     moveq    #0,d3
  128.     move.b    (a0)+,d3
  129.     move.l    a0,d2
  130.     move.l    Output,d1
  131.     jsr    _LVOWrite(a6)
  132.     bra    Koniec
  133.  
  134. ParseTheDate:
  135.  
  136.     move.l    Year,d0
  137.     moveq    #0,d5
  138.     moveq    #0,d6
  139.     moveq    #0,d7
  140.     divu    #STO,d0
  141.     move.w    d0,d5
  142.     swap    d0
  143.     move.w    d0,d6
  144.  
  145.     move.l    d6,d3
  146.     beq    TestCalendar
  147.  
  148.     andi.l    #FEB_MASK,d3
  149.     bne    TestCalendar
  150.  
  151.     moveq    #1,d7
  152.  
  153. TestCalendar:
  154.  
  155.     cmpi.l    #YEAR_1582,Year
  156.     bgt    OurCalendar
  157.     blt    Julian
  158.  
  159.     cmpi.l    #MONTH_1582,Month
  160.     bgt    OurCalendar
  161.     blt    Julian
  162.  
  163.     cmpi.l    #DAY_1582,Day
  164.     bge    OurCalendar
  165.  
  166. Julian:
  167.     moveq    #0,d3
  168.     move.l    d5,d2
  169.     divu    #7,d2
  170.     swap    d2
  171.     move.w    d2,d3
  172.     bra    TakeYear
  173.  
  174. OurCalendar:
  175.  
  176.     move.l    #0,d3
  177.  
  178.     cmpi.l    #17,d5
  179.     beq    TakeYear
  180.     cmpi.l    #21,d5
  181.     beq    TakeYear
  182.     cmpi.l    #25,d5
  183.     beq    TakeYear
  184.  
  185.     move.l    #2,d3
  186.  
  187.     cmpi.l    #18,d5
  188.     beq    TakeYear
  189.     cmpi.l    #22,d5
  190.     beq    TakeYear
  191.     cmpi.l    #26,d5
  192.     beq    TakeYear
  193.  
  194.     move.l    #4,d3
  195.  
  196.     cmpi.l    #15,d5
  197.     beq    TakeYear
  198.     cmpi.l    #19,d5
  199.     beq    TakeYear
  200.     cmpi.l    #23,d5
  201.     beq    TakeYear
  202.     cmpi.l    #27,d5
  203.     beq    TakeYear
  204.  
  205.     move.l    #5,d3
  206.     cmpi.l    #16,d5
  207.     beq    TakeYear
  208.     cmpi.l    #20,d5
  209.     beq    TakeYear
  210.     cmpi.l    #24,d5
  211.     beq    TakeYear
  212.     cmpi.l    #28,d5
  213.     beq    TakeYear
  214.  
  215.     bra    BadData
  216.  
  217. TakeYear:
  218.  
  219.     mulu    #4,d3
  220.     lea    YearTable,a0
  221.     move.l    (a0,d3.l),a0
  222.  
  223.     moveq    #0,d2
  224.     moveq    #0,d3
  225.     move.l    d6,d1
  226.     move.l    d1,d3
  227.     divu    #4,d1
  228.     move.w    d1,d2
  229.     add.l    d2,d3
  230.     moveq    #0,d1
  231.     moveq    #0,d2
  232.     divu    #7,d3
  233.     swap    d3
  234.     move.w    d3,d2
  235.  
  236.     moveq    #0,d0
  237.     move.b    (a0,d2.l),d0
  238.  
  239.     cmpi.l    #1,Month
  240.     bne    TakeFebruary
  241.  
  242.     tst.l    d7
  243.     beq    TakeUsualJanuary
  244.  
  245.     lea    MTable5,a0
  246.     bra    TakeAMonth
  247.  
  248. TakeUsualJanuary:
  249.     lea    MTable6,a0
  250.     bra    TakeAMonth
  251.  
  252. TakeFebruary:
  253.     cmpi.l    #2,Month
  254.     bne    TakeMarch
  255.  
  256.     tst.l    d7
  257.     beq    TakeUsualFebruary
  258.  
  259.     lea    MTable1,a0
  260.     bra    TakeAMonth
  261.  
  262. TakeUsualFebruary:
  263.     lea    MTable2,a0
  264.     bra    TakeAMonth
  265.  
  266. TakeMarch:
  267.     cmpi.l    #3,Month
  268.     bne    TakeApril
  269.  
  270.     lea    MTable2,a0
  271.     bra    TakeAMonth
  272.  
  273. TakeApril:
  274.     cmpi.l    #4,Month
  275.     bne    TakeMay
  276.  
  277.     lea    MTable5,a0
  278.     bra    TakeAMonth
  279.  
  280. TakeMay:
  281.     cmpi.l    #5,Month
  282.     bne    TakeJune
  283.  
  284.     lea    MTable0,a0
  285.     bra    TakeAMonth
  286.  
  287. TakeJune:
  288.     cmpi.l    #6,Month
  289.     bne    TakeJuly
  290.  
  291.     lea    MTable3,a0
  292.     bra    TakeAMonth
  293.  
  294. TakeJuly:
  295.     cmpi.l    #7,Month
  296.     bne    TakeAugust
  297.  
  298.     lea    MTable5,a0
  299.     bra    TakeAMonth
  300.  
  301. TakeAugust:
  302.     cmpi.l    #8,Month
  303.     bne    TakeSeptember
  304.  
  305.     lea    MTable1,a0
  306.     bra    TakeAMonth
  307.  
  308. TakeSeptember:
  309.     cmpi.l    #9,Month
  310.     bne    TakeOctober
  311.  
  312.     lea    MTable4,a0
  313.     bra    TakeAMonth
  314.  
  315. TakeOctober:
  316.     cmpi.l    #10,Month
  317.     bne    TakeNovember
  318.  
  319.     lea    MTable6,a0
  320.     bra    TakeAMonth
  321.  
  322. TakeNovember:
  323.     cmpi.l    #11,Month
  324.     bne    TakeDecember
  325.  
  326.     lea    MTable2,a0
  327.     bra    TakeAMonth
  328.  
  329. TakeDecember:
  330.     cmpi.l    #12,Month
  331.     bne    BadData
  332.  
  333.     lea    MTable4,a0
  334.  
  335. TakeAMonth:
  336.     moveq    #0,d1
  337.     move.b    (a0,d0.l),d1
  338.  
  339.     moveq    #0,d0
  340.     moveq    #0,d2
  341.     moveq    #0,d3
  342.     move.l    Day,d2
  343.     divu    #7,d2
  344.     swap    d2
  345.     move.w    d2,d3
  346.     tst.l    d3
  347.     beq    DayZero
  348.     subq.l    #1,d3
  349.     bra    TakeADay
  350.  
  351. DayZero:
  352.     move.l    #6,d3
  353.  
  354. TakeADay:
  355.     mulu    #4,d3
  356.  
  357.     lea    DayTable,a0
  358.     move.l    (a0,d3.l),a0
  359.  
  360.     move.b    (a0,d1.l),d0
  361.     rts
  362.  
  363. BadData:
  364.     move.l    #FALSE,d0
  365.     rts
  366.  
  367. ParseDate:
  368.     tst.b    (a0)
  369.     beq    ParseBad
  370.  
  371.     lea    DayBuffer,a1
  372. ParseDay:
  373.     move.b    (a0)+,(a1)+
  374.     cmpi.b    #'.',(a0)
  375.     beq    DayParsed
  376.     cmpi.b    #'-',(a0)
  377.     beq    DayParsed
  378.     tst.b    (a0)
  379.     beq    ParseBad
  380.     bra    ParseDay
  381.  
  382. DayParsed:
  383.     move.b    #0,(a1)
  384.     adda.l    #1,a0
  385.     tst.b    (a0)
  386.     beq    ParseBad
  387.     lea    MonthBuffer,a1
  388.  
  389. ParseMonth:
  390.     move.b    (a0)+,(a1)+
  391.     cmpi.b    #'.',(a0)
  392.     beq    MonthParsed
  393.     cmpi.b    #'-',(a0)
  394.     beq    MonthParsed
  395.     tst.b    (a0)
  396.     beq    ParseBad
  397.     bra    ParseMonth
  398.  
  399. MonthParsed:
  400.     move.b    #0,(a1)
  401.     adda.l    #1,a0
  402.     tst.b    (a0)
  403.     beq    ParseBad
  404.     lea    YearBuffer,a1
  405.  
  406. ParseYear:
  407.     move.b    (a0)+,(a1)+
  408.     cmpi.b    #'.',(a0)
  409.     beq    YearParsed
  410.     cmpi.b    #'-',(a0)
  411.     beq    YearParsed
  412.     tst.b    (a0)
  413.     beq    YearParsed
  414.     bra    ParseYear
  415.  
  416. YearParsed:
  417.     move.b    #0,(a1)
  418.  
  419.     move.l    _DOSBase,a6
  420.     lea    DayBuffer,a1
  421.     move.l    a1,d1
  422.     lea    Day,a2
  423.     move.l    a2,d2
  424.     jsr    _LVOStrToLong(a6)
  425.     tst.l    d0
  426.     bmi    ParseBad
  427.  
  428.     lea    MonthBuffer,a1
  429.     move.l    a1,d1
  430.     lea    Month,a2
  431.     move.l    a2,d2
  432.     jsr    _LVOStrToLong(a6)
  433.     tst.l    d0
  434.     bmi    ParseBad
  435.  
  436.     lea    YearBuffer,a1
  437.     move.l    a1,d1
  438.     lea    Year,a2
  439.     move.l    a2,d2
  440.     jsr    _LVOStrToLong(a6)
  441.     tst.l    d0
  442.     bmi    ParseBad
  443.  
  444.     cmpi.l    #YEAR_MAX,Year
  445.     bgt    ParseBad
  446.  
  447.     cmpi.l    #MONTH_MAX,Month
  448.     bgt    ParseBad
  449.     tst.l    Month
  450.     beq    ParseBad
  451.  
  452.     tst.l    Day
  453.     beq    ParseBad
  454.  
  455.     cmpi.l    #FEBRUARY,Month
  456.     bne    CheckDay
  457.  
  458.     move.l    Year,d0
  459.     moveq    #0,d1
  460.     divu    #STO,d0
  461.     swap    d0
  462.     move.w    d0,d1
  463.     beq    UsualFebruary
  464.  
  465.     andi.l    #FEB_MASK,d1
  466.     bne    UsualFebruary
  467.  
  468.     cmpi.l    #DAY29_MAX,Day
  469.     bgt    ParseBad
  470.     bra    ParseOver
  471.  
  472. UsualFebruary:
  473.     cmpi.l    #DAY28_MAX,Day
  474.     bgt    ParseBad
  475.     bra    ParseOver
  476.  
  477. CheckDay:
  478.     move.l    Month,d0
  479.     cmpi.l    #M31_MAX,d0
  480.     ble    UsualMonth
  481.     subq.l    #1,d0
  482.  
  483. UsualMonth:
  484.     btst    #0,d0
  485.     beq    PMonth
  486.  
  487.     cmpi.l    #DAY31_MAX,Day
  488.     bgt    ParseBad
  489.     bra    ParseOver
  490.  
  491. PMonth:
  492.     cmpi.l    #DAY30_MAX,Day
  493.     bgt    ParseBad
  494.  
  495. ParseOver:
  496.     move.l    #TRUE,d0
  497.     rts
  498.  
  499. ParseBad:
  500.     move.l    #FALSE,d0
  501.     rts
  502.  
  503. CountString:
  504.     move.l    a1,a0
  505.     moveq    #0,d0
  506. CountLoop:
  507.     cmpi.b    #0,(a0)
  508.     beq    Counted
  509.     cmpi.b    #10,(a0)
  510.     beq    Terminated
  511.     adda.l    #1,a0
  512.     addq.l    #1,d0
  513.     bra    CountLoop
  514.  
  515. Terminated:
  516.     move.b    #0,(a0)
  517. Counted:
  518.     rts
  519.  
  520. OpenDOS:
  521.     lea    DosName,a1
  522.     moveq    #0,d0
  523.     jsr    _LVOOpenLibrary(a6)
  524.     move.l    d0,_DOSBase
  525.     rts
  526.  
  527. CloseDOS:
  528.     move.l    _DOSBase,a1
  529.     move.l    4,a6
  530.     jsr    _LVOCloseLibrary(a6)
  531.     rts
  532.  
  533.     section Date2Dayd,data
  534.  
  535. YearTable:
  536.     dc.l    YTable0
  537.     dc.l    YTable1
  538.     dc.l    YTable2
  539.     dc.l    YTable3
  540.     dc.l    YTable4
  541.     dc.l    YTable5
  542.     dc.l    YTable6
  543.  
  544. YTable0:
  545.     dc.b    6,0,1,2,3,4,5
  546. YTable1:
  547.     dc.b    5,6,0,1,2,3,4
  548. YTable2:
  549.     dc.b    4,5,6,0,1,2,3
  550. YTable3:
  551.     dc.b    3,4,5,6,0,1,2
  552. YTable4:
  553.     dc.b    2,3,4,5,6,0,1
  554. YTable5:
  555.     dc.b    1,2,3,4,5,6,0
  556. YTable6:
  557.     dc.b    0,1,2,3,4,5,6
  558.  
  559. MTable0:
  560.     dc.b    1,2,3,4,5,6,0
  561. MTable1:
  562.     dc.b    2,3,4,5,6,0,1
  563. MTable2:
  564.     dc.b    3,4,5,6,0,1,2
  565. MTable3:
  566.     dc.b    4,5,6,0,1,2,3
  567. MTable4:
  568.     dc.b    5,6,0,1,2,3,4
  569. MTable5:
  570.     dc.b    6,0,1,2,3,4,5
  571. MTable6:
  572.     dc.b    0,1,2,3,4,5,6
  573.  
  574. DayTable:
  575.     dc.l    DTable0
  576.     dc.l    DTable1
  577.     dc.l    DTable2
  578.     dc.l    DTable3
  579.     dc.l    DTable4
  580.     dc.l    DTable5
  581.     dc.l    DTable6
  582.  
  583. DTable0:
  584.     dc.b    6,7,1,2,3,4,5
  585. DTable1:
  586.     dc.b    7,1,2,3,4,5,6
  587. DTable2:
  588.     dc.b    1,2,3,4,5,6,7
  589. DTable3:
  590.     dc.b    2,3,4,5,6,7,1
  591. DTable4:
  592.     dc.b    3,4,5,6,7,1,2
  593. DTable5:
  594.     dc.b    4,5,6,7,1,2,3
  595. DTable6:
  596.     dc.b    5,6,7,1,2,3,4
  597.     dc.b    0
  598.  
  599. DayNames:
  600.     dc.l    0
  601.     dc.l    Monday
  602.     dc.l    Tuesday
  603.     dc.l    Wednesday
  604.     dc.l    Thursday
  605.     dc.l    Friday
  606.     dc.l    Saturday
  607.     dc.l    Sunday
  608.  
  609. Monday:
  610.     dc.b    7,'Monday',10
  611. Tuesday:
  612.     dc.b    8,'Tuesday',10
  613. Wednesday:
  614.     dc.b    10,'Wednesday',10
  615. Thursday:
  616.     dc.b    9,'Thursday',10
  617. Friday:
  618.     dc.b    7,'Friday',10
  619. Saturday:
  620.     dc.b    9,'Saturday',10
  621. Sunday:
  622.     dc.b    7,'Sunday',10
  623.     dc.b    0
  624.  
  625. BadArgsTxt:
  626.     dc.b    14,'Date invalid!',10,0
  627.  
  628. InfoTxt:
  629.     dc.b    55,10,'Date2Day v1.0 By Tadek Knapik.',10
  630.     dc.b    'Usage: d2d dd.mm.year',10,10,0
  631.  
  632. DosName:
  633.     dc.b    'dos.library',0
  634.  
  635.     section    Date2Dayb,bss
  636.  
  637. _SysBase:
  638.     ds.l    1
  639.  
  640. _DOSBase:
  641.     ds.l    1
  642.  
  643. Output:
  644.     ds.l    1
  645.  
  646. Date:
  647.     ds.l    1
  648.  
  649. Day:
  650.     ds.l    1
  651.  
  652. Month:
  653.     ds.l    1
  654.  
  655. Year:
  656.     ds.l    1
  657.  
  658. DayBuffer:
  659.     ds.b    12
  660.  
  661. MonthBuffer:
  662.     ds.b    12
  663.  
  664. YearBuffer:
  665.     ds.b    12
  666.  
  667.